package bean;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.ItemOrdenPedidoVO;

@Entity 
@Table( name = "items_orden_de_pedido" )
public class ItemOrdenPedido extends EntidadPersistente{
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Producto producto;
	private Integer cantidadPedida;
	@OneToMany (cascade = CascadeType.ALL, mappedBy = "itemOrdenPedido")
	private List<ProductoEntregado> productosEntregados;
	@ManyToOne
	private OrdenPedido ordenPedido;
	
	public ItemOrdenPedido () {}
	
	public ItemOrdenPedido (OrdenPedido ordenPedido, Producto producto, Integer cantidadPedida) {
		this.ordenPedido = ordenPedido;
		this.producto = producto;
		this.cantidadPedida = cantidadPedida;
		this.productosEntregados = new ArrayList<ProductoEntregado>();
	}
	
	public ItemOrdenPedidoVO getVO() {
		ItemOrdenPedidoVO vo = new ItemOrdenPedidoVO();
		vo.setCantidadPedida(cantidadPedida);
		vo.setProducto(producto != null ? producto.getVO() : null);
		
		return vo;
	}
	
	public Integer getCantidadEnviada() {
		int val = 0;
		
		for (ProductoEntregado prod : productosEntregados) {
			val += prod.getCantidadEnviada();
		}
		
		return val;
	}
	
	public int agregarProductoEntregado(RemitoODV remito, int cantidadMaxima) {
		
		int totalEnviado = this.getCantidadEnviada(); 
		
		int cantidadAgregar = Math.min(cantidadMaxima, cantidadPedida - totalEnviado);
		
		if(cantidadAgregar > 0) {
			ProductoEntregado prod = new ProductoEntregado(this, cantidadAgregar, remito);
			this.productosEntregados.add(prod);
		}
		
		return cantidadAgregar;
	}

	public Producto getProducto() {
		return producto;
	}
	
	public void setProducto(Producto producto) {
		this.producto = producto;
	}
	
	public Integer getCantidadPedida() {
		return cantidadPedida;
	}
	
	public void setCantidadPedida(Integer cantidadPedida) {
		this.cantidadPedida = cantidadPedida;
	}
	
	public List<ProductoEntregado> getProductosEntregados() {
		return productosEntregados;
	}
	
	public void setProductosEntregados(List<ProductoEntregado> productosEntregados) {
		this.productosEntregados = productosEntregados;
	}

	public OrdenPedido getOrdenPedido() {
		return ordenPedido;
	}

	public void setOrdenPedido(OrdenPedido ordenPedido) {
		this.ordenPedido = ordenPedido;
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		result = primo * (result + (producto == null ? 0 : producto.hashCode()) + (ordenPedido == null ? 0 : ordenPedido.hashCode()));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof ItemOrdenPedido))) {
			return false;
		}
		
		ItemOrdenPedido otro = (ItemOrdenPedido) obj;
		
		boolean mismoProducto = (producto!=null && otro.producto != null ? (producto.equals(otro.producto)) : false);
		boolean mismaOrden = (ordenPedido!=null && otro.ordenPedido != null ? (ordenPedido.equals(otro.ordenPedido)) : false);
		
		return mismoProducto && mismaOrden;
	}
}
